package objetsRadar;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Vector;

import visualisationRadar.VisualisationRadar;

public class Traitement {			
	public static Vector<Double> lireFichier(String nom,int type_valeur) throws IOException 
	{   	
		FileInputStream fichier;
		if ((type_valeur%2)==0){
			fichier=new FileInputStream(VisualisationRadar.repertoireDonneesQualite+nom);
		}else{
			fichier=new FileInputStream(VisualisationRadar.repertoireDonneesRR+nom);
		}
		DataInputStream entree=new DataInputStream(fichier);

		Vector<Double> tabpixel=new Vector<Double>();
//		int nb=0;
		boolean eof = false;     

		if (type_valeur==3) /*flottants*/
		{
			float val;
			while(!eof)
			{
				try
				{    
					val=entree.readFloat();          						
					tabpixel.add((double)reverse(val));
//					nb++;
				}

				catch (EOFException e)
				{
					eof=true;
				} 
			}
		}
		if (type_valeur==1) /*short int */
		{
			short val; 
			while(!eof)
			{
				try
				{    
					val=entree.readShort();          						
					tabpixel.add((reverse(val))/100.);
//					nb++;
				}
				catch (EOFException e)
				{
					eof=true;



				}
			}
		}

		if (type_valeur==2 || type_valeur==4) /*byte*/
		{
			byte val; 
			while(!eof)
			{
				try
				{    
					val=entree.readByte();          						
					tabpixel.add((double)val);
//					nb++;
				}
				catch (EOFException e)
				{
					eof=true;
				}  

			}

		}

		entree.close();
		
		return tabpixel;
	}

	public static float reverse(float x) {
		// passage de LITTLE_ENDIAN à BIG_ENDIAN (lecture en java) et vice versa 
		// (i.e. on inverse les octets de poids fort et faible)

		return ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN).putFloat(x)
		.order(ByteOrder.LITTLE_ENDIAN).getFloat(0);
	}
	public static short reverse(short x) {
		return ByteBuffer.allocate(2).order(ByteOrder.BIG_ENDIAN).putShort(x)
		.order(ByteOrder.LITTLE_ENDIAN).getShort(0);
	}

	public static void ecrireFichier(String nom,int type_valeur,Vector<Double> tabpixel) throws IOException 
	{   	
		FileOutputStream fichier;
		if ((type_valeur%2)==0){
			fichier=new FileOutputStream(VisualisationRadar.repertoireDonneesQualite+nom);
			System.out.println("Ecriture du fichier cumul : "+nom);

		}else{
			fichier=new FileOutputStream(VisualisationRadar.repertoireDonneesRR+nom);
			System.out.println("Ecriture du fichier cumul : "+nom);
		}
		DataOutputStream sortie=new DataOutputStream(fichier);
		int nb=0;
		//boolean eof = false;     

		if (type_valeur==3) /*flottants*/
		{
			while(nb<tabpixel.size())
			{
				try
				{   
					//tabpixel.add((double)reverse(val));
					sortie.writeFloat(reverse(tabpixel.get(nb).floatValue()));          						
					nb++;
				}

				catch (EOFException e)
				{
					//eof=true;
					break;
				} 
			}
		}
		if (type_valeur==1) /*short int */
		{
			while(nb<tabpixel.size())
			{
				try
				{    
					sortie.writeShort(reverse((short)(tabpixel.get(nb)*100.)));          						
					nb++;
				}
				catch (EOFException e)
				{
					//eof=true;
					break;
				}
			}
		}

		if (type_valeur==2 || type_valeur==4) /*byte*/
		{
			while(nb<tabpixel.size())
			{
				try
				{    
					sortie.writeByte(tabpixel.get(nb).byteValue());          						
					nb++;
				}
				catch (EOFException e)
				{
					//eof=true;
					break;
				}  
			}

		}
		sortie.close();
	}
}
